// 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量。

// 计算一个数组中，任意两个数之间汉明距离的总和。

/**
 * @param {number[]} nums
 * @return {number}
 */
 var totalHammingDistance = function (nums) {
  let maxLength = Math.max(...nums).toString(2).length
  let toString2nums = nums.map(e => {
      let num = e.toString(2)
      return `${'0'.repeat(maxLength - num.length)}${num}`
  })
  let nums1Map = new Map()
  let nums0Map = new Map()
  for (let i = 0; i < maxLength; i++) {
      for (let l = 0; l < toString2nums.length; l++) {
          if (toString2nums[l][i] == 1) {
              nums1Map.set(i, (nums1Map.get(i) || 0) + 1)
          } else {
              nums0Map.set(i, (nums0Map.get(i) || 0) + 1)
          }
      }
      nums1Map.set(i, nums1Map.get(i) || 0)
      nums0Map.set(i, nums0Map.get(i) || 0)
  }
  let total = 0
  for (let i = 0; i < maxLength; i++) {
      if (nums1Map.get(i) != 0 && nums0Map.get(i) != 0) {
          total += nums1Map.get(i) * nums0Map.get(i)
      }
  }
  return total
};